#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

class MyString
{
public:
    MyString(size_t n, char c);
    MyString(const char* p = "");
    MyString(const MyString& str);
    void swap(MyString str);
    void ShowStr() const;
    const MyString& operator=(MyString str);
    static int GetCount() { return _count; }
    ~MyString();

private:
    char* _str = nullptr;
    int _size = 0;
    int _capacity = 0;
    static int _count;
};

int MyString::_count = 0;

MyString::MyString(size_t n, char c)
    :_str(new char[n + 1] {0})
    , _size(n)
    , _capacity(n)
{
    for (int i = 0; i < n; i++) _str[i] = c;
    _count++;
}

MyString::MyString(const char* p)
    :_size(strlen(p))
{
    _capacity = _size == 0 ? _size : 15;
    _str = new char[_capacity + 1] {0};
    strcpy(_str, p);

    _count++;
}

MyString::MyString(const MyString& str)
    :_size(str._size)
    , _capacity(str._capacity)
{
    _str = new char[_capacity + 1] {0};
    strcpy(_str, str._str);
    _count++;
}

void MyString::swap(MyString str)
{
    std::swap(_str, str._str);
    std::swap(_size, str._size);
    std::swap(_capacity, str._capacity);
}

const MyString& MyString::operator=(MyString str)
{
    swap(str);
    return *this;
}

void MyString::ShowStr() const 
{ 
    for (int i = 0; i < _size; i++) 
        cout << _str[i]; 
}

MyString::~MyString()
{
    delete[] _str;
    _str = nullptr;
    _count--;
}

// 实验内容：
// 实现一个自己的字符串类MyString，要求包含以下函数：
// 构造函数：
// MyString(unsigned n, char c)：将字符c重复n次得到字符串
// MyString(char* p)：根据传入的字符数组得到字符串
// 根据需要，还需要设计默认构造函数、拷贝构造函数等其它函数。
// 其中，MyString类需要提供一个静态方法GetCount，功能为获取到本程序在运行的过程中某时刻有多少个MyString的对象。
// 本次实验提供了部分代码，请使用以下代码调用MyString类的功能完成输入、处理、输出操作：

void fun1(int n)
{
    MyString* strArr = new MyString[n];
    cout << strArr[0].GetCount() << endl;
    delete[] strArr; 
    strArr = nullptr;
}

void fun2(int n)
{
    MyString* pStr = new MyString[n];
    cout << MyString::GetCount() << endl;
}

void fun3(MyString& s1, MyString s2)
{
    MyString s3;
    s3 = s1 = s2;
    cout << MyString::GetCount() << endl;
    s3.ShowStr();
    cout << endl;
}

int main()
{
    MyString s1;
    MyString s2;
    int n;
    char charArr[20];
    int op;

    while (cin >> op)
    {
        switch (op)
        {
        case 1:
        {
            cin >> n;
            fun1(n);
            break;
        }
        case 2:
        {
            cin >> n;
            fun2(n);
            break;
        }
        case 3:
        {
            int m;
            char ch;
            cin >> m >> ch;
            s2 = MyString(m, ch);
            fun3(s1, s2);
            s1.ShowStr();

            cout << endl;

            break;
        }
        case 4:
        {
            cin >> charArr;
            s1 = MyString(charArr);
            cout << MyString::GetCount() << endl;
            s1.ShowStr();
            cout << endl;
            break;
        }
        }
    }
    return 0;
}
